import 'dart:math';

class CYMath {
  static String doubleToString(double value) {
    if(value == null) return null;
    if(value.toInt() == value.floor()) return value.toInt().toString();
    return value.toString();
  }

  static double decimalSubstract(double a, double  b, [int decimal = 2]) {
    if(decimal<= 0) return a - b;
    return ((a * pow(10 ,decimal)).roundToDouble() - (b * pow(10, decimal)).roundToDouble()) / pow(10, decimal);
  }

  static double decimalSubstractList(double a, List<double>  b, [int decimal = 2]) {
    double sub = a;
    for(int i=0;i<b.length;i++) {
      sub = decimalSubstract(sub, b[i], decimal);
    }
    return sub;
  }

  static String formatDistance(double distance) {
    if(distance == null) {
      return "";
    }
    if(distance<50) {
      return '小于50m';
    }
    if(distance<1000) {
      return "${distance.round()}m";
    }
    if(distance<10*1000) {
      return "${(distance/1000).round()}km";
    } else {
      return "10km外";
    }
    
    // if(distance<1000*1000*10) {
    //   return "${(distance/(1000*1000)).round()}千公里";
    // }
    // if(distance<1000*1000*100) {
    //   return "${(distance/(1000*1000*10)).round()}万公里";
    // }
    // else {
    //   return "遥远的天际";
    // }
  }
  /// 整除
  static double divide(double a, double b, [int decimal = 2]) {
    if(a == null || b == null ) return null;
    if(b == 0) {
      print("除数不能为0");
      return null;
    }
    return (a * pow(10, decimal) ~/ b) / pow(10, decimal);
  }
  /// 保留两位小数
  static String toStringAsFixed(double a, [int decimal = 2]) {
    if(a==null) return null;
    return ((a * pow(10, decimal) ~/ 1) / pow(10, decimal)).toStringAsFixed(decimal);
  }
  /// double转字符串
  static String toStringExt(double a) {
    if(a == null) return '';
    if(a.truncateToDouble() == a) {
      return a.truncate().toString();
    } else {
      return a.toString();
    }
  }
}

class NumberRange {
  final int min;
  final int max;
  final List<int> value = <int>[];
  NumberRange(this.min, this.max) {
    assert(min<max, "最大值必须大于最小值");
    for(int i=min;i<=max;i++) {
      value.add(i);
    }
  }
  /// 获取下标值，如果没有获取到则返回0
  int indexOf(int v) {
    if(v==null) return 0;
    int index = value.indexOf(v);
    return index == -1 ? 0 : index;
  }
  /// 获取下标对应的值，如果没有找到或者超出下标，则返回数值第一个值
  int at(int index) {
    if(index == null || index<0 || index >= value.length) {
      return value.first;
    }
    return value[index];
  }
  /// 是否在数值范围内
  bool isInner(num v) {
    if(v == null) return false;
    return v >= min && v <= max;
  }

  /// 百分比
  double percent(double v) {
    if(v>=max) return 1;
    if(isInner(v)) {
      return (v - min) / (max - min);
    }
    return 0;
  }
}
